﻿using System;
using System.Web.Mvc;

namespace LAPI.Web.Controllers.CentroDeportivo
{
    /// <summary>
    /// Controlador para /CentroDeportivo/
    /// </summary>
    public class CentroDeportivoController : BaseController
    {

        #region /CentroDeportivo/Gestion
        /// <summary>
        /// GET: /CentroDeportivo/Gestion
        /// </summary>
        /// <returns>View Gestion.cshtml</returns>
        [HttpGet]
        public ActionResult Gestion()
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)
            {
                LAPI.Business.Gestores.GestorCentrosDeportivos gestor = new Business.Gestores.GestorCentrosDeportivos();

                return View(gestor.ObtenerTodos());
            }

            return resultado;
        }
        #endregion

        #region /CentroDeportivo/Editar

        /// <summary>
        /// GET: /CentroDeportivo/Editar
        /// </summary>
        /// <param name="id">Identificador único del centro deportivo</param>
        /// <returns>View Editar.cshtml</returns>
        [HttpGet]
        public ActionResult Editar(Int32 id)
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null && id != 0)
            {
                LAPI.Business.Gestores.GestorCentrosDeportivos gestor = new Business.Gestores.GestorCentrosDeportivos();
                return View(gestor.ObtenerPorID(IdCentroDeportivo: id));
            }

            return resultado;
        }

        /// <summary>
        /// POST: /CentroDeportivo/Editar
        /// </summary>
        /// <param name="model">modelo de CentroDeportivo</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Editar(LAPI.Data.Model.CentroDeportivo model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos realizar el cambio            
            LAPI.Business.Acciones.AccValidarDatosEditarCentroDeportivo validacion = new Business.Acciones.AccValidarDatosEditarCentroDeportivo();
            resultado = validacion.ValidarDatosEditarCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Modificamos los datos
            LAPI.Business.Acciones.AccEditarCentroDeportivo modificar = new Business.Acciones.AccEditarCentroDeportivo();
            resultado = modificar.EditarCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }          

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "CentroDeportivo"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /CentroDeportivo/Crear

        /// <summary>
        /// GET: /CentroDeportivo/Crear
        /// </summary>
        /// <returns>View Crear.cshtml</returns>
        [HttpGet]
        public ActionResult Crear()
        {
            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)                 
            {
                    return View();
            }

            return resultado;
        }

        /// <summary>
        /// POST: /CentroDeportivo/Crear
        /// </summary>
        /// <param name="model">modelo de CentroDeportivo</param>
        /// <returns>String con el resultado JSON de la operacion</returns>
        [HttpPost]
        public String Crear(LAPI.Data.Model.CentroDeportivo model)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Validamos que podamos crear
            LAPI.Business.Acciones.AccValidarDatosCrearCentroDeportivo validacion = new Business.Acciones.AccValidarDatosCrearCentroDeportivo();
            resultado = validacion.ValidarDatosCrearCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //2. Creamos
            LAPI.Business.Acciones.AccCrearCentroDeportivo crear = new Business.Acciones.AccCrearCentroDeportivo();
            resultado = crear.CrearCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //3. Todo ha ido bien, redirigimos a la vista de gestion
            resultado = new Business.Acciones.ResultadoAccion();
            resultado.setResultado(Business.Acciones.TipoResultado.REDIRECCION);
            resultado.addMensaje(
                mensaje: Url.Action(actionName: "Gestion", controllerName: "CentroDeportivo"),
                tipoMensaje: Business.Acciones.TipoMensaje.REDIRECCION
            );

            return resultado.ResultadoToJson();
        }
        #endregion

        #region /CentroDeportivo/Eliminar

        /// <summary>
        /// GET: /CentroDeportivo/Eliminar
        /// </summary>
        /// <param name="id">identificador del centro deportivo</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Eliminar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Eliminamos los datos del centro deportivo
            LAPI.Business.Acciones.AccEliminarCentroDeportivo eliminar = new LAPI.Business.Acciones.AccEliminarCentroDeportivo();
            LAPI.Data.Model.CentroDeportivo model = new LAPI.Data.Model.CentroDeportivo();
            model.idCentroDeportivo = id;
            resultado = eliminar.EliminarCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }
           
        #endregion

        #region /CentroDeportivo/Activar y /CentroDeportivo/Desactivar

        /// <summary>
        /// GET: /CentroDeportivo/Activar
        /// </summary>
        /// <param name="id">identificador del centro deportivo</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Activar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Activamos
            LAPI.Business.Acciones.AccEstadoCentroDeportivo activar = new LAPI.Business.Acciones.AccEstadoCentroDeportivo();
            LAPI.Data.Model.CentroDeportivo model = new LAPI.Data.Model.CentroDeportivo();
            model.activo = true;
            model.idCentroDeportivo = id;
            resultado = activar.ActivarCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }

        /// <summary>
        /// GET: /CentroDeportivo/Desactivar
        /// </summary>
        /// <param name="id">identificador del centro deportivo</param>
        /// <returns>String con el resultado JSON</returns>
        [HttpGet]
        public String Desactivar(Int32 id)
        {
            LAPI.Business.Acciones.ResultadoAccion resultado = null;

            //0. Comprobamos que haya sesión
            resultado = comprobarPermisoAdminSistema();
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            //1. Desactivamos
            LAPI.Business.Acciones.AccEstadoCentroDeportivo desactivar = new LAPI.Business.Acciones.AccEstadoCentroDeportivo();
            LAPI.Data.Model.CentroDeportivo model = new LAPI.Data.Model.CentroDeportivo();
            model.activo = false;
            model.idCentroDeportivo = id;
            resultado = desactivar.DesactivarCentroDeportivo(datosCentroDeportivo: model);
            if (resultado.getResultado() == Business.Acciones.TipoResultado.ERROR)
            {
                //informamos del error
                return resultado.ResultadoToJson();
            }

            return resultado.ResultadoToJson();
        }

        #endregion

        #region Filtros Búsqueda

        /// <summary>
        /// POST: /CentroDeportivo/Buscar
        /// </summary>
        /// <param name="idcentroFilter">Filtro por identificador</param>
        /// <param name="descripcionFilter">Filtro por descripcion</param>
        /// <param name="direccionFilter">Filtro por direccion</param>
        /// <param name="telefonoFilter">Filtro por telefono</param>
        /// <returns>_ListadoCentroDeportivo.cshtml</returns>
        [HttpPost]
        public ActionResult Buscar(String idcentroFilter, String descripcionFilter, String direccionFilter, String telefonoFilter)
        {

            ActionResult resultado = comprobarErrorPermisoAdminSistema();
            if (resultado == null)
            {
                LAPI.Business.Gestores.GestorCentrosDeportivos gestor = new Business.Gestores.GestorCentrosDeportivos();

                //Creamos el filtro con los parametros posibles
                System.Collections.Hashtable filtro = new System.Collections.Hashtable();
                if (!String.IsNullOrEmpty(idcentroFilter))
                    filtro.Add("idCentroDeportivo", idcentroFilter);
                if (!String.IsNullOrEmpty(descripcionFilter))
                    filtro.Add("descripcion", descripcionFilter);
                if (!String.IsNullOrEmpty(direccionFilter))
                    filtro.Add("direccion", direccionFilter);
                if (!String.IsNullOrEmpty(telefonoFilter))
                    filtro.Add("telefono", telefonoFilter);

                return PartialView("_ListadoCentroDeportivo", gestor.ObtenerBusqueda(filtroBusqueda: filtro));
            }

            return resultado;            
        }

        #endregion

        /*################## SERVICIOS ##################*/

        #region /CentroDeportivo/getCentros

        /// <summary>
        /// GET: /CentroDeportivo/getCentros
        /// </summary>
        /// <returns>String con el json de la respuesta</returns>
        [HttpGet]
        public String getCentros()
        {
            LAPI.Business.Acciones.AccGetCentrosDeportivos getter = new Business.Acciones.AccGetCentrosDeportivos();

            var items = getter.GetCentrosDeportivos();

            return LAPI.Data.Model.CentroDeportivo.toJson(items);
        }

        #endregion
    }
}
